Colin Walters [Tue, 8 Apr 2014 21:41:28 +0000 (17:41 -0400)]
deploy: Also fsync parent directory of modified config files
Colin Walters [Tue, 8 Apr 2014 21:37:35 +0000 (17:37 -0400)]
deploy: Ensure that any modified config files are fsync()d
It really wouldn't do for one to be missing one's ssh keys for
example...
Colin Walters [Tue, 8 Apr 2014 21:31:17 +0000 (17:31 -0400)]
checkout: fsync() directory on checkouts
We want to be really sure that our deployment roots have hit the disk.
Colin Walters [Tue, 8 Apr 2014 21:24:07 +0000 (17:24 -0400)]
deploy: Ensure that all directories we create are fsync()d
There's two halves to this; first, when we create an hierarchy, we
need to call fsync(). Second, we need to fsync again anytime after
we've modified a directory.
Colin Walters [Tue, 8 Apr 2014 21:22:38 +0000 (17:22 -0400)]
libotutil: Add API to create directory hierarchy recursively *and* fsync
To be really sure that any directory entries have hit disk we need to
call fsync() on the directory fd. This API allows us to conveniently
create a directory hierarchy, fsyncing all of it along the way.
Colin Walters [Fri, 11 Apr 2014 05:31:14 +0000 (01:31 -0400)]
pull: Display download progress of individual objects as we get it
It was kind of annoying at least for rpm-ostree upgrades since /boot
happens to be first and we eat a 21MB initramfs with no download
progress.
https://bugzilla.gnome.org/show_bug.cgi?id=726348
Colin Walters [Tue, 8 Apr 2014 22:15:52 +0000 (18:15 -0400)]
libotutil: Fix mistaken return of TRUE in error path
Gah, must have been a refactoring bug.
Colin Walters [Fri, 4 Apr 2014 20:52:36 +0000 (16:52 -0400)]
Use external libgsystem 2014.2
It's been split off for a while, let's kill the code duplication.
Among other things, this fixes the systemd detection for the journal
logging.
Colin Walters [Fri, 4 Apr 2014 20:51:37 +0000 (16:51 -0400)]
switch: Always allow chronological downgrades
Ideally we'd have something a bit more strict, but...without
downloading the parentage, this is all we can do at the moment.
Colin Walters [Fri, 4 Apr 2014 02:39:41 +0000 (22:39 -0400)]
deploy: Call fsync() on parent directory before/after symlink swap
Let's be conservative here and try hard to ensure the symlink has the
correct content on disk.
Colin Walters [Fri, 4 Apr 2014 02:20:59 +0000 (22:20 -0400)]
bootloader: fdatasync() bootloader configuration
Let's be a bit more conservative here and actually fdatasync() the
configurations we're generating.
I'm seeing an issue at the moment where syslinux isn't finding the
config sometimes, and while I don't think this is the issue, let's try
it.
Colin Walters [Fri, 4 Apr 2014 01:08:03 +0000 (21:08 -0400)]
bootloaders: Always write out bootloader config file
There was an attempted optimization to only write if changed, but this
is broken - we always write the bootloader config into a new
directory.
In theory we should only be writing if it changed, but let's not do a
broken optimization.
Colin Walters [Thu, 3 Apr 2014 23:39:07 +0000 (19:39 -0400)]
deploy: Add a debug message for which bootloader is used
Debugging something...
Colin Walters [Thu, 3 Apr 2014 22:29:07 +0000 (18:29 -0400)]
deploy: Add an assertion that deployment directory exists
I may be seeing something going wrong in rpm-ostree, just adding this
assertion for my own sanity.
Colin Walters [Thu, 3 Apr 2014 12:04:32 +0000 (08:04 -0400)]
tool: End status line after pull
Otherwise we potentially get overlapped output.
Colin Walters [Tue, 1 Apr 2014 23:12:39 +0000 (19:12 -0400)]
fetcher: Honor http_proxy environment variable
https://bugzilla.gnome.org/show_bug.cgi?id=706809
Colin Walters [Tue, 1 Apr 2014 17:07:17 +0000 (13:07 -0400)]
checkout: Always do chmod even in _MODE_USER
The previous commit here changed things so that we do mkdir(x, 0700),
then fchmod later only if we created the directory.
However the logic was incorrect; we still need to chmod even in
MODE_USER if we created the directory.
Colin Walters [Tue, 1 Apr 2014 14:00:18 +0000 (10:00 -0400)]
tools: Fix unintialized variables
Colin Walters [Tue, 1 Apr 2014 02:27:34 +0000 (22:27 -0400)]
upgrade: Support --allow-downgrade again
This was unintentially dropped with the OstreeSysrootUpgrader rebase.
Colin Walters [Mon, 31 Mar 2014 18:41:13 +0000 (14:41 -0400)]
sysroot-upgrader: Check merge deployment, not ref for differences
Otherwise this broke atomicity; we could fetch/store the ref, then
crash, and then not upgrade the next time we tried upgrading.
The correct model is: the tree has changed if the new ref is different
from the merge deployment.
Colin Walters [Sun, 30 Mar 2014 23:37:17 +0000 (19:37 -0400)]
ostree(1): Document GPG verification, link to ostree.repo(5)
Colin Walters [Sun, 30 Mar 2014 23:32:50 +0000 (19:32 -0400)]
doc: Add ostree.repo and ostree.repo-config manual pages
In particular I wanted to document gpg-verify.
Colin Walters [Sat, 29 Mar 2014 01:06:22 +0000 (21:06 -0400)]
sysroot: Be more conservative with bootlink optimization
Trying to implement "rpm-ostree rollback", in the case where we have 2
deployments with the same bootconfig that we're reordering, we need to
write bootconfig, not just swap the bootlinks.
Colin Walters [Thu, 27 Mar 2014 11:45:13 +0000 (07:45 -0400)]
tool: End status line in switch/upgrade too
Colin Walters [Thu, 27 Mar 2014 11:36:50 +0000 (07:36 -0400)]
libostree/upgrader: Don't pull if there is no remote
In this case we're just reading the local repo.
Colin Walters [Tue, 25 Mar 2014 20:46:24 +0000 (16:46 -0400)]
libostree/upgrader: Add an API to retrieve an origin description
This will be used by "rpm-ostree upgrade".
Colin Walters [Tue, 25 Mar 2014 19:47:20 +0000 (15:47 -0400)]
libostree/upgrader: Throw an error if osname is empty
This shouldn't happen; I'm just adding the check to force a rebuild.
Colin Walters [Sun, 23 Mar 2014 12:54:28 +0000 (08:54 -0400)]
Add an OstreeSysrootUpgrader API
This moves some utility code from the ostree tool into the shared
library, which will make it easier to consume by external tools.
Colin Walters [Sun, 23 Mar 2014 15:36:09 +0000 (11:36 -0400)]
Move basic commit API into ostree_sysroot_simple_write_deployment()
The admin commands had this shared in tool common, but we want to
encourage external programs to do this as well.
Michael Scherer [Sat, 22 Mar 2014 10:45:45 +0000 (11:45 +0100)]
Add missing admin commands in the man pages
Michael Scherer [Sat, 22 Mar 2014 10:14:24 +0000 (11:14 +0100)]
improve consistency with others admin commands
Michael Scherer [Sat, 22 Mar 2014 10:13:44 +0000 (11:13 +0100)]
Fix typo in man page ( envrionment => environment )
Colin Walters [Fri, 21 Mar 2014 18:54:03 +0000 (14:54 -0400)]
Release 2014.3
Colin Walters [Fri, 21 Mar 2014 18:52:56 +0000 (14:52 -0400)]
pull: Don't print, just use progress callback
More work on removing g_print() from the library.
Colin Walters [Mon, 17 Mar 2014 23:39:59 +0000 (19:39 -0400)]
pull: End status line on error as well
This way we don't append the error to the current line.
Colin Walters [Mon, 17 Mar 2014 23:24:56 +0000 (19:24 -0400)]
core: Add "admin instutil set-kargs"
This will be used by Anaconda as a convenience command to set the
bootloader arguments.
Colin Walters [Mon, 17 Mar 2014 23:24:10 +0000 (19:24 -0400)]
libostree: Add ostree_sysroot_deployment_set_kargs()
It turns out people sometimes want to be able to change the kernel
arguments. Add a convenient API to do so for the current deployment.
This will be used by Anaconda.
Colin Walters [Mon, 17 Mar 2014 23:21:39 +0000 (19:21 -0400)]
libostree: Fix ostree_deployment_clone() to also clone bootconfig
This way one can easily mutate it for a new deployment list.
Colin Walters [Mon, 17 Mar 2014 23:21:05 +0000 (19:21 -0400)]
libostree: Add ostree_bootconfig_parser_clone()
This will be necessary to fix ostree_deployment_clone(), but is
potentially useful on its own for other consumers.
Colin Walters [Mon, 17 Mar 2014 16:28:36 +0000 (12:28 -0400)]
Add "ostree admin instutil", move selinux-ensure-labeled there
There are going to be a few utilities that are only useful for
installers and disk image creation tools. Let's not expose them all
at the toplevel; instead, hide them under "instutil".
Colin Walters [Wed, 19 Mar 2014 13:13:28 +0000 (09:13 -0400)]
test-sysroot: Use GSystem to spawn subprocess
I was getting a weird hang in the installed tests with the shell as a
zombie process, not reaped by the parent, which was just stuck in
select() on the output pipes. The thing is we don't actually want to
capture stdout/stderr, we just want to inherit.
GSystem.Subprocess makes that possible, so let's just use it now that
it's a proper installed library.
Colin Walters [Wed, 19 Mar 2014 13:15:29 +0000 (09:15 -0400)]
Revert "Disable test-sysroot.test"
This reverts commit
73868a96d14fa13e69d9df778d2363b89f41fef5.
Vadim Rutkovsky [Wed, 19 Mar 2014 12:08:37 +0000 (13:08 +0100)]
Disable test-sysroot.test
It hangs on test-sysroot.js:40 during GLib.spawn_command_line_sync - it seems it can't
handle sh -c and the inner process becomes a zombie
Colin Walters [Sat, 15 Mar 2014 23:05:52 +0000 (19:05 -0400)]
TODO: update
Colin Walters [Sat, 15 Mar 2014 17:15:58 +0000 (13:15 -0400)]
Remove custom SELinux policy
This was a temporary hack until the requisite bits landed upstream in
the Fedora SELinux policy.
Colin Walters [Sat, 15 Mar 2014 01:59:35 +0000 (21:59 -0400)]
libostree: Fix crash if output is not a tty
This was a recent regression.
Colin Walters [Sat, 15 Mar 2014 01:57:47 +0000 (21:57 -0400)]
libostree: Add API to append a GPG signature
This will be used by rpm-ostree which needs to use an external program
to sign commits.
Colin Walters [Fri, 14 Mar 2014 18:42:45 +0000 (14:42 -0400)]
libostree: Add a better error if we fail to read keyring directory
I had accidentally put it in the -devel package and not noticed.
Colin Walters [Thu, 13 Mar 2014 12:14:26 +0000 (08:14 -0400)]
admin: selinux-ensure-labeled: new builtin
Code like rpm-ostree generates disk images directly. In order to
ensure SELinux labeling is correct, it currently has a helper program
that runs over the deployment root, then over the whole disk and to
only set a label if none exist.
In order to make it easier to write installers such as Anaconda
without having them depend on rpm-ostree (or whatever other
build-server side program), pull in the helper code here.
Colin Walters [Tue, 11 Mar 2014 17:16:37 +0000 (13:16 -0400)]
deploy: Less usage of g_print
No need to spam the console here.
Colin Walters [Tue, 11 Mar 2014 17:15:57 +0000 (13:15 -0400)]
libostree: Remove g_print() from bootloader code
No need to be so chatty.
Colin Walters [Tue, 11 Mar 2014 13:36:54 +0000 (09:36 -0400)]
pull: Drop some g_print(), replace others with async progress
We shouldn't g_print() from a library, particularly when the
expectation is that the client has an async progress set up.
This should fix the pull output extending the status line.
Colin Walters [Sat, 8 Mar 2014 00:30:01 +0000 (19:30 -0500)]
pull: Ensure temporary data that appears corrupted is deleted
If a MITM attacker (or just network corruption) causes a temporary
downloaded object in tmp/ to be corrupted, we'll end up
continually trying to commit it, and fail.
Fix this unlinking the temp file immediately after opening it. This
will ensure that if we exit due to an error (or crash), the kernel
will clean up the space for us.
https://bugzilla.gnome.org/show_bug.cgi?id=725924
Colin Walters [Sat, 1 Mar 2014 20:46:03 +0000 (15:46 -0500)]
packaging: Update internal spec file
Colin Walters [Sat, 1 Mar 2014 20:10:39 +0000 (15:10 -0500)]
build: Add --enable-selinux-custom-policy
Don't use this.
It's just for me, and only temporarily until this stuff all lands in
the Fedora (and ideally upstream) selinux-policy.
Colin Walters [Sat, 1 Mar 2014 18:55:55 +0000 (13:55 -0500)]
Release 2014.2
Colin Walters [Fri, 28 Feb 2014 08:48:23 +0000 (03:48 -0500)]
Add /run/ostree-booted
The idea with this is that things like yum should be able to look for
it and determine whether or not they should assume that they can
change things on the system.
https://bugzilla.gnome.org/show_bug.cgi?id=725380
Colin Walters [Thu, 27 Feb 2014 21:25:33 +0000 (16:25 -0500)]
upgrade/switch: Fix status line being overwritten with pull progress
Colin Walters [Thu, 27 Feb 2014 16:49:49 +0000 (11:49 -0500)]
checkout: Use fd-relative open of newly created directory
We were walking the full path again on our directories, no need to do
that.
Colin Walters [Thu, 27 Feb 2014 16:19:33 +0000 (11:19 -0500)]
checkout: Only fchown/fchmod directories after we're done populating them
See https://mail.gnome.org/archives/ostree-list/2014-February/msg00020.html
Colin Walters [Wed, 26 Feb 2014 21:34:37 +0000 (16:34 -0500)]
Update libgsystem, use it to set dirfd-relative xattrs on symlinks
This is a bit more efficient in that we're not walking full paths, and
it helps avoid security/reliability issues if an attacker (or just a
misbehaving process) has the ability to mutate paths in the middle.
Colin Walters [Wed, 26 Feb 2014 20:12:46 +0000 (15:12 -0500)]
upgrade: Properly set origin_refspec variable for resolve/printing
1) We were ignoring the remote, which is broken
2) We were printing NULL later on
Colin Walters [Wed, 26 Feb 2014 20:12:08 +0000 (15:12 -0500)]
switch: Don't check whether revision matches
It's quite possible that say "buildmaster" and "smoketested" are the
same revision - but we should allow switching between them.
Colin Walters [Fri, 21 Feb 2014 17:56:41 +0000 (12:56 -0500)]
pull: Remove explicit threading
Mixing async and threads has proved to be too much for my little mind.
It has race conditions that I've tried repeatedly to fix, but failed.
The threading here was scanning metadata objects - and there are
two parts to that:
1) Physically loading them from disk
2) Parsing them
Now #1 has been partially addressed by avoiding a storm of lstat() if
we're starting from a known working state. If pull gets interrupted,
then we do need to rescan all objects. Also, we can address this with
local metadata packfiles.
The other potentially slow bit is that we recurse across the metadata,
blocking the main thread. We could ameliorate that in the future by
scheduling metadata parsing as idle "chunks".
Anyways, let's move the needle back to reliability, and readd speed
more carefully.
https://bugzilla.gnome.org/show_bug.cgi?id=706456
Colin Walters [Thu, 20 Feb 2014 23:25:56 +0000 (18:25 -0500)]
upgrade: Refuse chronologically older commits unless --allow-downgrade
We don't want to allow MITM attackers to intercept upgrade requests
and provide clients with older OS versions vulnerable to security
flaws.
Only "ostree admin upgrade" gets this behavior for now - whether we
want to do it for "ostree admin switch" is another question.
Colin Walters [Thu, 20 Feb 2014 19:19:49 +0000 (14:19 -0500)]
repo: Fix crash without SELinux policy enabled during commit
Colin Walters [Thu, 20 Feb 2014 15:12:53 +0000 (10:12 -0500)]
build: Fix build without SELinux
Colin Walters [Wed, 19 Feb 2014 13:40:29 +0000 (08:40 -0500)]
libostree: Split off SELinux OstreeSePolicy class
It's better if this is independent from the OstreeSysroot; for
example, a policy is active in a given deployment root at once, not
for a sysroot globally.
We can also collect SELinux-related API in one place.
Unfortunately at the moment there can be only one instance of this
class per process.
Colin Walters [Wed, 19 Feb 2014 13:37:54 +0000 (08:37 -0500)]
Add internal SELinux policy overrides
In the future, this will likely include an ostree_t domain. For now,
this is just a few additional allow rules.
Colin Walters [Fri, 14 Feb 2014 23:16:10 +0000 (18:16 -0500)]
manual-tests: New directory with custom test scripts
This is just a demo script.
Daniel Drake [Thu, 13 Feb 2014 16:57:10 +0000 (10:57 -0600)]
fetcher: set timeouts on HTTP connections
We're seeing some hangs while ostree is fetching updates.
I imagine the fact that SoupSessionAsync has no timeout by default
could be the cause of this.
Set timeout values to 60 seconds, which is the default for the new
SoupSession API which we may switch to later.
https://bugzilla.gnome.org/show_bug.cgi?id=724310
Colin Walters [Thu, 13 Feb 2014 15:57:05 +0000 (10:57 -0500)]
build: make "sudo make install" over existing install work
Cosimo Cecchi [Wed, 12 Feb 2014 01:15:19 +0000 (17:15 -0800)]
os-init: also create a symlink for /var/lock
After creating one for /var/run. This is needed at least on Debian
systems.
Colin Walters [Wed, 12 Feb 2014 21:47:39 +0000 (16:47 -0500)]
deploy: Remove now-unimplemented --no-bootloader argument
Daniel Drake [Tue, 11 Feb 2014 22:13:34 +0000 (16:13 -0600)]
boot/ostree-remount.service: run before tmpfiles.d
tmpfiles.d configurations generally require write access to some places
that are read-only until ostree-remount runs.
Make sure ostree-remount has run first.
Thanks to Cosimo Cecchi for finding and diagnosing this problem.
https://bugzilla.gnome.org/show_bug.cgi?id=724183
Colin Walters [Mon, 10 Feb 2014 13:50:59 +0000 (08:50 -0500)]
repo: Split generic GPG commit verification out into helper
This will be used for a future commit which GPG verifies static
deltas.
Colin Walters [Mon, 10 Feb 2014 13:29:00 +0000 (08:29 -0500)]
deltas: Add a timestamp to delta metadata
Colin Walters [Sun, 9 Feb 2014 21:02:14 +0000 (16:02 -0500)]
pull: Remove a duplicate hash table
Not sure why we had two...perhaps the code originally had them
separate.
Colin Walters [Mon, 10 Feb 2014 14:38:07 +0000 (09:38 -0500)]
tests: Fix up GPG tests for more strict EL7 GPG
These GPG tests were failing for me on EL7 - it appears to be because
we had only one directory for both private and public keys, and we
were giving that to ostree for verification, which passed them onto
gpgv.
In EL7 beta at least, gpgv now barfs if it finds a private key where
it is just expecting to find public keys.
Fix this by splitting out the public trusted directory from the
private key directory. Except now for signing, we still need the
public key there, so symlink it. Whee!
Colin Walters [Mon, 10 Feb 2014 14:10:13 +0000 (09:10 -0500)]
repo: Don't set GPG engine executable path
The instructions one finds on the internets are apparently wrong, we
really need to keep the default here, since gpgme uses it to actually
find the helper binary it runs.
This fixes the GPG tests for me on EL7 at least.
Colin Walters [Sun, 9 Feb 2014 19:01:27 +0000 (14:01 -0500)]
Drop refs/summary
I'm not aware of anyone using this, and it's not efficient to write a
whole file every time a ref changes, plus it's not atomic.
Colin Walters [Sun, 9 Feb 2014 18:17:24 +0000 (13:17 -0500)]
sysroot: Add a log with MESSAGE_ID when deployment is complete
Colin Walters [Thu, 6 Feb 2014 08:46:14 +0000 (03:46 -0500)]
pull: Don't crash if the URL is not found
Colin Walters [Thu, 15 Aug 2013 13:17:37 +0000 (09:17 -0400)]
Initial basic static delta code drop
This has a very basic level of functionality (deltas can be generated,
and applied offline). There is only some stubbed out pull code to
fetch them via HTTP.
But, better to commit this now and improve it from a known starting
point, rather than have it languish in a branch.
Colin Walters [Thu, 15 Aug 2013 13:14:26 +0000 (09:14 -0400)]
core: Import bup's "rollsum" code, add a test case
For static deltas, one strategy that will be employed is to split each
object into chunks, and only include changed chunks in the deltas.
Colin Walters [Sun, 2 Feb 2014 16:53:22 +0000 (11:53 -0500)]
build: Drop SELinux required version a bit earlier
Apparently EPEL7 only has 2.1.13, but we should be fine with that.
Colin Walters [Sun, 2 Feb 2014 16:49:43 +0000 (11:49 -0500)]
build: Fix --without-selinux case
Colin Walters [Sun, 2 Feb 2014 16:32:52 +0000 (11:32 -0500)]
SELinux: Ensure we label /var, and fix /etc merge wrt xattrs
First, /var needs to be labeled at least once. We should probably
rearrange things so that /var is only created (and labeled) on the
first deployment, but this patch adds a /var/.ostree-selabeled file
instead.
Second, when doing the /etc merge, we compare the xattrs of the old
/usr/etc versus the current /etc. The problem with that is that the
policy has different labels for /usr/etc on disk than the real /etc.
The correct fix for this is a bit invasive - we have to take the
physical content of the old /usr/etc, but compare the labels as if
they were really in /etc.
Instead for now, just ignore changes to xattrs. If the file
content/mode changes, then we take the new file (including any changed
xattrs).
Bottom line: just doing chcon -t blah_t /etc/foo.conf may be lost on
upgrade (for now).
Colin Walters [Sat, 1 Feb 2014 16:30:10 +0000 (11:30 -0500)]
libostree: Also use xattr callback for directories
They need labels too, obviously.
Colin Walters [Sat, 1 Feb 2014 03:18:13 +0000 (22:18 -0500)]
Add --disable-fsync option to pull-local, and API to repo
This will be used by guestmount - it's WAY faster. We only take disks
as a unit, so it's safe. If the process fails halfway through, we
just start over from scratch the next time anyways.
Colin Walters [Wed, 29 Jan 2014 14:22:16 +0000 (09:22 -0500)]
Add SELinux support
The trees as shipped come with /usr/etc, which should just be labeled
as usr_t. When we do a deployment, we need to relabel the copies of
the files we're making in /etc.
SELinux support is compile and runtime optional.
Colin Walters [Wed, 29 Jan 2014 13:03:45 +0000 (08:03 -0500)]
repo: Add API to provide xattrs
This will be used by rpm-ostree to provide SELinux security contexts,
without requiring us to actually label the disk.
Colin Walters [Fri, 31 Jan 2014 00:32:59 +0000 (19:32 -0500)]
build: Look for /usr/bin/gpgv2 vs /usr/bin/gpgv
For some reason, RHEL has gpgv, but Fedora doesn't. We need to detect
which to use, since presumably Debian only has gpgv.
Colin Walters [Thu, 30 Jan 2014 22:17:36 +0000 (17:17 -0500)]
repo: Improve GPG error messages
The signing test is failing here on EL7 beta for me - it seems like
gnupg isn't honoring the homedir.
Colin Walters [Thu, 30 Jan 2014 20:40:46 +0000 (15:40 -0500)]
libostree: Actually trusted.gpg.d/*.gpg for GPG verification
The intent of this code I'm fairly certain was to use *.gpg from the
trusted.gpg.d, directory. But right now, we're only using
"pubring.gpg" from that directory, which is odd.
Let's fix this to use all keys ending in .gpg, which will also
include pubring.gpg.
Colin Walters [Thu, 30 Jan 2014 20:27:10 +0000 (15:27 -0500)]
build: Install README-gpg in /usr/share/ostree/trusted.gpg.d
Since this is what the current code actually reads.
Colin Walters [Mon, 27 Jan 2014 18:57:18 +0000 (13:57 -0500)]
ostree-prepare-root.service: Also order before plymouth-switch-root.service
In the OSTree model, /sysroot gets set up twice. We need to ensure
that the /sysroot plymouth sees is only after OSTree has set it up.
Colin Walters [Mon, 27 Jan 2014 16:57:35 +0000 (11:57 -0500)]
boot/ostree-remount.service: Run before plymouth-read-write.service
The plymouth service needs a writable /var, so ensure that we run
before it does.
Colin Walters [Mon, 27 Jan 2014 14:10:42 +0000 (09:10 -0500)]
doc: Update manpage a bit
I know, I know, it's about time...
Colin Walters [Fri, 24 Jan 2014 04:26:43 +0000 (04:26 +0000)]
Release 2014.1